package com.cskaoyan.javase.array._4operation._0traverse;

/**
 * 数组的遍历指的是依次访问（或输出）数组中的每一个元素
 * 数组的遍历是对数组操作最基本操作
 *
 * 这里我们手写一个数组的遍历,以遍历并输出数组元素为例.
 * @since 14:57
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3};
        // for循环循环遍历数组的快捷键,数组名.fori
        // 提取方法的快捷键 ctrl + alt + m
        // traverse(arr);

        // arr = new int[0];
        // arr = null;
        // 调用改进方法
        traverse8(arr);
    }

    public static void traverse(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }

    /*
        以上遍历输出元素的格式不够美观
        希望输出的格式是: [1, 2, 3]
        简洁美观
        如何改进呢?
     */
    public static void traverse2(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    /*
        以上方法的输出结果是: [1, 2, 3, ]
        最后面多了一个", "
        怎么办呢?如何去掉?
      */
    // if判断去掉逗号
    public static void traverse3(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1) {
                // 最后一个元素,不加逗号了
                System.out.print(arr[i]);
                break;
            }
            System.out.print(arr[i] + ", ");
        }
        System.out.println("]");
    }

    // 单独打印最后一个元素
    public static void traverse4(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length - 1; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.print(arr[arr.length - 1]);
        System.out.println("]");
    }

    // 用转义字符"\b"删除去掉
    public static void traverse5(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    /*
        以上方法,格式是已经完善了
        但方法的功能仍不完善
        因为方法接收的数组输入可能不是正常数组
        比如:
            1.长度为0的数组
            2.null数组
     */

    // 改进: 使得方法能够接收长度为0的数组输入,并给出用户友好的提示,并且不再打印"]"
    public static void traverse6(int[] arr) {
        if (arr.length == 0){
            System.out.println("您输入的数组是一个长度为0的数组,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    // 改进: 使得方法能够接收null数组的输入,同样给出用户友好的提示,而不是空指针异常
    public static void traverse7(int[] arr) {
        /*
            这里是判断"=="相等好?
            还是判断"!="不相等好?
            if判断的语句,应该尽量要更少的代码被if包裹,这样的话,代码更简洁,更清晰.
            这里很明显是"=="更好
         */
       if (arr == null){
           System.out.println("您输入的数组是null,请重新输入");
           return;
       }
        if (arr.length == 0){
            System.out.println("您输入的数组是一个长度为0的数组,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }

    // 改进: 反正都不是不正常情况,同时处理null和长度为0数组
    public static void traverse8(int[] arr) {
        // 标准格式,固定范式
        if (arr == null || arr.length == 0){
            System.out.println("您输入的数组不正常,请重新输入!");
            return;
        }
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ", ");
        }
        System.out.println("\b\b]");
    }
}
